﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Com.Binaria.SISCOB.DTO;
using System.Globalization;
using System.Collections;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.Core;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace Com.Binaria.SISCOB.Mgr
{
    public class ImportarCB : IImportarCB
    {
        #region Miembros de IImportarCB

        public ItemCartolaDTO[] Cargar(string fileDir)
        {
            FileInfo oFile = new FileInfo(fileDir);
            return getDocumentos(oFile);
        }

        #endregion
        
        #region METODOS PROPIOS DE LA IMPLEMENTACION
        ItemCartolaDTO[] getDocumentos(FileInfo oFile)
        {
            string[] aValues = null;
            string[] aLines = null;
            //
            //using (StreamReader sr = new StreamReader(oFile.FullName, Encoding.UTF8))
            //{
            //    aLines = sr.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            //    sr.Close();
            //}
            aLines = File.ReadAllLines(oFile.FullName);
            //
            CartolaDTO oDTO = new CartolaDTO();
            //Preparar: Cuenta Corriente
            aValues = aLines[6].Split(';');
            oDTO.CuentaCorriente = new CuentaCorrienteDTO();
            oDTO.CuentaCorriente.NmrCuenta = getValue(aValues[0]);
            oDTO.CuentaCorriente.EstaActivo = true;
            //Preparar: Cartola
            aValues = aLines[9].Split(';');
            oDTO.Usuario = getValue(aValues[0]);
            oDTO.FchEmision = getFecha(getValue(aValues[2]));

            aValues = aLines[12].Split(';');
            oDTO.Folio = Convert.ToInt32(getValue(aValues[0]));
            oDTO.FchDesde = getFecha(getValue(aValues[3]));
            oDTO.FchHasta = getFecha(getValue(aValues[4]));

            //Preparar: Items
            ArrayList oLst = new ArrayList(16);
            long totMonto = 0;
            for (int i = 18; i < aLines.Length - 14; i++)
            {
                aValues = aLines[i].Split(';');
                if (aValues[0].Trim().Length < 1) continue;
                //
                ItemCartolaDTO oItem = new ItemCartolaDTO();
                oItem.Sucursal = new SucursalDTO();

                oItem.Sucursal.Descripcion = getValue(aValues[1]);
                oItem.Sucursal.EstaActivo = true;
                //
                if (aValues[2].Length > 0) oItem.NmrOperacion = getValue(aValues[2]);

                oItem.DscOperacion = getValue(aValues[3]).ToUpper();
                // Tipo de ItemContable por defecto
                oItem.Tipo = "C";
                oItem.Monto = 0;
                if (aValues[5].Length > 0)
                {
                    oItem.Monto = getMonto(getValue(aValues[5]));
                    oItem.NmrOperacion = "00000";
                    oItem.Tipo = "A";

                }
                else if (aValues[4].Length > 0)
                {
                    oItem.Monto = getMonto(getValue(aValues[4]));
                    oItem.Tipo = "C";
                }
                //
                oItem.FchOperacion = getFecha(string.Format("{0}{1}{2}", getValue(aValues[0])
                                                                       , CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator
                                                                       , oDTO.FchDesde.Value.Year));
                oItem.EstaProcesado = false;
                totMonto += (long)oItem.Monto;
                //
                oItem.Cartola = oDTO;
                oLst.Add(oItem);
            }
            //
            return (ItemCartolaDTO[])oLst.ToArray(typeof(ItemCartolaDTO));
        }
        #endregion

        #region METODOS DE USO INTERNO
        DateTime? getFecha(string valor)
        {
            DateTime? oResult = null;
            //
            string[] aValues = valor.Split(new char[] { '-', '/' }, StringSplitOptions.RemoveEmptyEntries);
            //
            if (aValues.Length > 3)
                oResult = Convert.ToDateTime(
                        string.Format("{1}{0}{2}{0}{3} {4}",
                                          CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator
                                        , aValues[0]
                                        , aValues[1]
                                        , getValue(aValues[2])
                                        , getValue(aValues[3]))
                                      );
            else if (aValues.Length == 3)
                oResult = Convert.ToDateTime(
                        string.Format("{1}{0}{2}{0}{3}",
                                          CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator
                                        , aValues[0]
                                        , aValues[1]
                                        , getValue(aValues[2]))
                                      );
            //
            return oResult;
        }

        long getMonto(string valor)
        {
            long oResult = 0;
            //
            oResult = Convert.ToInt64(valor.Replace(".", string.Empty));
            //
            return oResult;
        }

        string getValue(string valor)
        {
            if (string.IsNullOrEmpty(valor)) return valor;
            //
            if (!Char.IsLetterOrDigit(valor[0]) && valor.Length > 2)
                return valor.Substring(1).Trim();
            else if (!Char.IsLetterOrDigit(valor[valor.Length - 1]))
                return valor.Remove(valor.Length - 1).Trim();
            //
            return valor;
        }
        #endregion
    }
}
